package com.kkb;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Stream;

/**
 * @Author kkb
 * @Version 1.0
 * @Date 2024/8/1 11:03
 * @Description AbstractDocument
 */

public abstract class AbstractDocument implements Document {

    private final Map<String, Object> properties;

    public AbstractDocument(Map<String, Object> properties) {
        Objects.requireNonNull(properties, "properties map is required");
        this.properties = properties;
    }

    @Override
    public Void put(String key, Object value) {
        properties.put(key, value);
        return null;
    }

    @Override
    public Object get(String key) {
        return properties.get(key);
    }

    @Override
    public <T> Stream<T> children(String key, Function<Map<String, Object>, T> constructor) {
//        java9的语法
//        return Stream.ofNullable(get(key)) // 将get(key)的结果转换为一个可选的单元素流
//                .filter(Objects::nonNull)  // 确保元素非空
//                .map(el -> (List<Map<String, Object>>) el)  // 强制转换这个元素为List<Map<String, Object>>
//                .findAny()  // 获取这个流中的任意元素，实际上只有一个元素
//                .stream()  // 将Optional转换为Stream以便进一步操作
//                .flatMap(Collection::stream)  // 将List转换为Stream中的元素流
//                .map(constructor);  // 将每个元素通过constructor转换为类型T

        // 使用Optional来代替ofNullable以处理null的情况
        Stream<T> stream = Optional.ofNullable(get(key))
                // 仍然假定这是一个List<Map<String, Object>>
                .map(el -> (List<Map<String, Object>>) el)
                // 如果列表不为空，将其转换为Stream
                .map(Collection::stream)
                // 如果列表为空，提供一个空的Stream
                .orElseGet(Stream::empty)
                // 将每个Map转换为T类型
                .map(constructor);
        return stream;
    }
}
